package com.nancy.java_design.observer.demo1;

import java.util.ArrayList;

/**
 * 观察者模式
 * 观察者模式(Observer Pattern)是对象的行为模式
 * 定义对象间的一种一对多的依赖关系，使得当该对象状态改变时，所有依赖于它的对象都会得到通知并自动更新。
 * 观察者模式属于行为型模式，其主要优点如下：
 * 1. 观察者和被观察者之间是抽象耦合的
 * 2. 符合开闭原则
 * 其缺点如下：
 * 1. 如果一个被观察者对象有很多的直接和间接的观察者的话，将所有的观察者都通知到会花费很多时间
 * 2. 如果观察者和被观察者之间有循环依赖的话，观察者会触发它们之间的循环调用，导致死循环
 * 3. 观察者模式没有相应的机制让观察者知道所观察的对象是怎么发生变化的
 * 其应用场景：
 * 1. 关联行为场景，需要注意的是，关联行为是可拆分的，但是需要维护对象的引用关系
 * 2. 事件多级触发场景，如一个按钮点击事件会触发多个事件，每个事件又会触发其它的子事件
 * 3. 跨系统的消息交换场景，如一个企业中的HR系统与工资发放系统，它们之间需要通信
 * 4. 时间优先处理场景，如一个按钮点击事件会触发多个事件，每个事件又会触发其它的子事件，但是每个事件的优先级不同
 * 5. 状态变化的通知场景
 * 6. 数据同步场景，如多线程操作同一个对象
 * 7. 数据校验场景
 * 8. 异步处理场景
 * 9. 跨平台场景，如Java Swing、Android
 * 10. 跨语言场景
 * <p>
 * 具体的主体角色
 */
public class SubjectObject implements Subject {
    private ArrayList<Observer> observers = new ArrayList<>();

    @Override
    public void registerObserver(Observer observer) {
        observers.add(observer);
    }

    @Override
    public void removeObserver(Observer observer) {
        observers.remove(observer);
    }

    // 通知所有的观察者
    @Override
    public void notifyObservers(String message) {
        if (observers != null && observers.size() > 0)
            observers.forEach(observer -> observer.update(message));
    }
}
